简明SQL

    SQL

    表结构操作

    查看表结构

    创建表结构

    增加表的字段

    删除表的字段

    删除表

    创建索引

    检索数据select

    数据检索SQL一般由select子句、from子句、join子句、where子句、group by子句、having子句 、order by子句组成。from子句后的其他子句不是必须要有的,根据实际需要进行使用。各个子句出现的相对顺序不能颠倒。Select检索数据的逻辑处理流程为:

    join连接表-->where 对行过滤-->group by分组-->having对组过滤-->聚集函数处理-->order by排序-->输出结果。(当有子查询时先处理内层子查询,再处理外层查询)。

    简单检索SQL

    过滤行使用where

    where关系运算符:

    • 大于( >):只检索出满足指定字段大于指定值的数据,其余被过滤掉。

    • 小于(<):只检索出满足指定字段小于指定值的数据,其余被过滤掉

    • 等于(=):只检索出满足指定字段等于指定值的数据,其余被过滤掉

    • 大于或等于(>=):只检索出满足指定字段大于或等于指定值的数据,其余被过滤掉

    • 小于或等于(<=):只检索出满足指定字段小于或等于指定值的数据,其余被过滤掉

    • 不等于(<>或!=):只检索出满足指定字段不等于指定值的数据,其余被过滤掉

    • in操作符:只检索出满足指定字段在指定数据集合里的数据,其余被过滤掉

    • like通配匹配符:只检索出满足指定字段能与like后跟的搜索模式匹配的数据,其余被过滤掉

      • 百分号通配符(%):匹配任意字符出现任意次数。可以用在搜索模式的开始、中间和结尾处。
      • 下划线通配符(_):只匹配单个字符
      • 方括号通配符([ ]):方括号通配符里用于指定一个字符集, 只匹配出一个在该字符集里的字符。
    • and操作符:组合多个条件,检索出同时满足多个条件的数据

    • or操作符:组合多个条件,检索出满足条件之一的数据

    检索结果分组用group by

    group by关键字指示DBMS对指定列中数据都相同的分为一组,group by 后的列相当分组的维度。

    • group by 可以包含任意数目的列
    • group by 子句中列出的每个列都必须是检索列或有效表达式(不能是聚集函数)。如果select 中使用列表达式,group by 中也要是表达式而不能是表达式的别名。
    • 除进行聚集计算的列外,select中的每个列必须是group by中给出的列。
    • 分组列中如果有null值,则列的所有null值将分为一个组

    过滤检索结果中的分组用having

    where对行进行过滤,having则对组进行过滤。having支持所有where子句中的操作符号。由于where在对数据分组前进数据行过滤,having则在分组后进行组的过滤,所以where排除的行不会包含在分组中,having过滤条件的字段必须是group by 中的字段。where中不能包含聚集函数,而having中可以包含聚集函数。

    排序检索结果用order by

    汇总检索结果使用聚集函数

    聚集函数:运行在列的分组上,返回单个值的函数。如果有进行分组,聚集函数在分组后进行聚集

    常用聚集函数:

    • AVG(column):返回指定列的均值
    • COUNT(column):返回指定列的值的数目
    • MAX(column):返回指定列的最大值
    • MIN(column):返回指定列的最大值
    • SUM(column):返回指定列值之和

    聚集函数参数:聚集函数作用的的列名前可以加上distinct或all参数。all为默认参数,聚集函数作用的的列名前不加参数时默认为all,会对指定列的所用行进行计算,如果聚集函数作用的的列名前加上distinct参数,只会对指定列的不同值进行计算。有些数据库并不支持distinct。

    关联查询用join...on...

    关联查询中的笛卡尔积

    左连接left join right-table on...:包含左表的所有记录甚至是右表中没有和它匹配的记录。

    右连接right join right-table on...:包含右表的所有记录甚至是左表中没有和它匹配的记录。

    内连接inner join....on... :又称之为等值连接。仅仅选出两张表中互相匹配的记录

    关联查询耗资源,不要连接不必要的表。

    关联查询与子查询可转换。

    自连接:

    全外部连接

    组合查询使用union

    union 操作符用于合并两个或多个 select 语句的结果集,要求select 子句的列的数据类型相似。

    • 多个查询中从不同表返回类似结构数据
    • 对单个表执行多个查询,按单个表返回查询数据

    union的结果不包含重复值,union all的结果包含重复值。

    子查询:嵌套在其他查询中的完整查询语句,可以嵌套的地方有

    • 把子查询用作返回列
    • 把子查询用作where条件

    子查询总是从内向外处理。做为子查询的select语句只能查询单个列。

    插入数据insert

    插入一行数据用 insert into

    插入从表中检索出来的数据(可以是多行)用 insert into...select...

    复制数据到一个表中用 select ...into...

    更新数据update

    使用where条件限定需要更新的行,省略where将更新整个表。编写时需要注意where条件的正确性,避免误操作。

    删除数据delete

    使用where条件限定需要删除的行,省略where将删除整个表的数据。编写时需要注意where条件的正确性,避免误操作。

    SQL优化思路

    • 优化select子句

      用需要查询列的名字代替通配符*。使用SELECT *时一方面数据库需要去查询表的元数据来将 * 解析为表的具体字段, 另一方面会查询出表所有列的数据,而有的列的数据我们并不需要。这两者都会造成执行效率的下降。

    • 优化join子句

    • 优化where子句

      优化or条件:对于含有or的查询子句,如果要利用索引,则or之间的每个条件都必须要用到索引;如果没有索引则需要考虑增加索引。或者优化or为union查询。

    • 优化子查询为关联查询:join之所以比子查询更有效率是因为其不需要建立临时表来完成这个需要多个查询步骤的工作。

    • 使用SQL hint :在SQL中人为加入提示来达到优化操作的目的。